/**
 * <li>文件名：MappingTag.java
 * <li>说明：
 * <li>创建人： 曾明辉
 * <li>创建日期：2008-11-3
 * <li>修改人： 
 * <li>修改日期：
 */
package com.gp.base.tag.mapping;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

import org.springframework.web.context.support.WebApplicationContextUtils;

import com.gp.base.BaseDao;

/**
 * <li>类型名称：
 * <li>说明：
 * <li>创建人： 曾明辉
 * <li>创建日期：2008-11-3
 * <li>修改人：
 * <li>修改日期：
 */
@SuppressWarnings("serial")
public class MappingTag extends BodyTagSupport {

	private String mappingMode; // 映射方式，提供值映射(string)和查询映射(hql)

	private String mappingString; // 映射值字符串，用逗号间隔多个映射关系，每个映射的键与值用冒号间隔

	private String mappingHql; // 从数据库获取映射的HQL语句

	private String beanName; // 放置在request中的属性名称

	public void setBeanName(String beanName) {
		this.beanName = beanName;
	}

	public void setMappingMode(String mappingMode) {
		this.mappingMode = mappingMode;
	}

	public void setMappingHql(String mappingHql) {
		this.mappingHql = mappingHql;
	}

	public void setMappingString(String mappingString) {
		this.mappingString = mappingString;
	}

	@Override
	public int doStartTag() throws JspException {
		if (mappingMode == null) {
			mappingMode = "string";
		}

		if (beanName == null) {
			new JspException("MappingTag必须输入beanName");
		}
		if ("string".equalsIgnoreCase(mappingMode)) {
			if (mappingString == null) {
				new JspException("进行值映射必须输入映射字符串string");
			} else {
				this.setMapByString(mappingString);
			}
		}
		if ("hql".equalsIgnoreCase(mappingMode)) {
			if (mappingHql == null) {
				new JspException("进行查询映射必须输入查询hql语句");
			} else {
				this.setMapByHql(mappingHql);
			}
		}

		return EVAL_BODY_INCLUDE;
	}

	@Override
	public int doEndTag() throws JspException {

		return SKIP_BODY;
	}
	/**
	 * 
	 * <li>方法名：setMapByString
	 * <li>@param mappingString
	 * <li>返回类型：void
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2008-11-3
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	private void setMapByString(String mappingString) {
		Map<String, String> map = new HashMap<String, String>();
		String[] strArr = mappingString.split(",");
		for(String str:strArr){
			String[] strMap = str.split(":");
			if(strMap.length ==1){
				map.put(strMap[0], strMap[0]);				
			}
			else if(strMap.length>1){
				map.put(strMap[0], strMap[1]);
			}
			
		}
		pageContext.setAttribute(beanName, map);
	}
	
	/**
	 * 
	 * <li>方法名：setMapByHql
	 * <li>@param mappingHql
	 * <li>返回类型：void
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2008-11-3
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	@SuppressWarnings("unchecked")
	private void setMapByHql(String mappingHql) {
		Map<String, String> map = new HashMap<String, String>();
		try {

			BaseDao baseDao = (BaseDao) WebApplicationContextUtils
					.getWebApplicationContext(pageContext.getServletContext())
					.getBean("baseDao");
			List<Object> list = baseDao.find(mappingHql);

			for (Object obj : list) {
				if (obj instanceof Object[]) {
					map.put(((Object[]) obj)[0].toString(), ((Object[]) obj)[1]
							.toString());
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		finally{
			pageContext.setAttribute(beanName, map);
		}
	}
}
